package com.siashan.toolkit.crypt.symmetric;

/**
 * AES加密算法实现<br>
 * 高级加密标准（英语：Advanced Encryption Standard，缩写：AES），在密码学中又称Rijndael加密法<br>
 * 对于Java中AES的默认模式是：AES/ECB/PKCS5Padding，如果使用CryptoJS，请调整为：padding: CryptoJS.pad.Pkcs7
 *
 * <p>
 * 相关概念说明：
 * <pre>
 * 秘钥长度：密钥的长度可以使用128位（AES-128）、192位（AES-192）或256位（AES-256）。密钥的长度不同，推荐加密轮数也不同
 *
 * mode:    加密算法模式，是用来描述加密算法（此处特指分组密码，不包括流密码，）在加密时对明文分组的模式，它代表了不同的分组方式
 * padding: 补码方式是在分组密码中，当明文长度不是分组长度的整数倍时，需要在最后一个分组中填充一些数据使其凑满一个分组的长度。
 * iv:      在对明文分组加密时，会将明文分组与前一个密文分组进行XOR运算（即异或运算），但是加密第一个明文分组时不存在“前一个密文分组”，
 *          因此需要事先准备一个与分组长度相等的比特序列来代替，这个比特序列就是偏移量。
 * </pre>
 * <p>
 * 相关概念见：https://blog.csdn.net/OrangeJack/article/details/82913804
 *
 * @author siashan
 * @since 1.0.7
 */
public class AES extends SymmetricCrypt {
    private static final long serialVersionUID = 1L;

    public AES(){}

    @Override
    public SymmetricAlgorithm getAlgorithm() {
        return SymmetricAlgorithm.AES;
    }

    public AES(Mode mode,Padding padding){
        super(SymmetricAlgorithm.AES,mode,padding);
    }


    /**
     * 构建加密算法类
     * <p>默认实现：AES/CBC/PKCS5Padding </p>
     *
     * @return 加密算法类
     */
    public static  SymmetricCrypt build(){
        return build(Mode.CBC,Padding.PKCS5Padding);
    }

    /**
     * 构建加密算法类
     *
     * @param mode      密码模式
     * @param padding   填充模式
     * @return  加密算法类
     */
    public static  AES build(Mode mode,Padding padding){
        return new AES(mode,padding);
    }

}
